package com.dy.mongo.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.neo4j.core.schema.GeneratedValue;
import org.springframework.data.neo4j.core.schema.Id;
import org.springframework.data.neo4j.core.schema.Node;
import org.springframework.data.neo4j.core.schema.Relationship;

import java.util.*;

/**
 * 西游记人物节点实体。
 * <p>
 * 使用动态关系 Map<String, List<Person>> 可以灵活地在运行时加入任意关系类型，
 * 如 "师徒"、"师兄弟"、"好友"、"仇敌" 等，而不用修改实体结构。
 */
@Node("Person")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {

    /** Neo4j 自动生成的内部 ID */
    @Id
    @GeneratedValue
    private Long id;

    /** CSV 中的主键（为了之后导入时快速定位） */
    private Long csvId;

    private String name;    // 姓名
    private String alias;   // 别名/法号
    private String species; // 种族：妖、仙、佛、人

    /**
     * 动态关系：key -> 关系类型；value -> 目标人物列表。
     * direction 默认为 OUTGOING，即从当前节点指向目标节点。
     */
    @Relationship
    private Map<String, List<Person>> relations = new HashMap<>();

    /**
     * 工具方法：向 Map 中添加一条关系。
     *
     * @param type   关系类型，例如 "师徒"、"兄弟" 等
     * @param target 目标人物节点
     */
    public void addRelation(String type, Person target) {
        relations.computeIfAbsent(type, k -> new ArrayList<>()).add(target);
    }
}